package org.opens.javaskill.design;

import org.junit.Test;

/**
 * 功能:
 *      工厂模式简介.
 */
public class FactoryPattern {

    @Test
    public void test1() throws Exception {
        Fruit apple = FruitFactory.getFruit("apple");
        System.out.println(apple.sayName());

        Fruit banana = FruitFactory.getFruit("banana");
        System.out.println(banana.sayName());

        //传入不存在的类名会抛出异常
        Fruit banana1 = FruitFactory.getFruit("banana1");
        System.out.println(banana1.sayName());
    }

}

/**
 * 功能:
 *      公共接口
 */
interface Fruit {

    public abstract String sayName();

}

/**
 * 功能:
 *      公共接口的实现1
 */
class Apple implements Fruit {


    @Override
    public String sayName() {
        return "I`m apple";
    }

}

/**
 * 功能:
 *      公共接口的实现2
 */
class Banana implements Fruit {

    @Override
    public String sayName() {
        return "I`m banana";
    }

}

/**
 * 功能:
 *      工厂方法, 私有构造不允许创建实例, static的方法可以通过类名调用.
 * 注意:
 *      1. 如果传入的名称对应的类不存在, 可以选择抛出异常, 因为即使返回null, 之后的程序也需要处理这个, 不如在源头上禁止
 *      这个可能发生的异常.
 */
class FruitFactory {

    private FruitFactory() {}

    public static Fruit getFruit(String name) throws Exception {
        if("apple".equals(name)) {
            return new Apple();
        }
        if("banana".equals(name)) {
            return new Banana();
        }
        throw new Exception("没有对应的类");
    }

}